package ar.uba.fi.algo3.algoflight.model.aviones;

import java.util.ArrayList;
import java.util.List;

import ar.uba.fi.algo3.algoflight.model.Direccion;
import ar.uba.fi.algo3.algoflight.model.Posicion;
import ar.uba.fi.algo3.algoflight.model.formas.Figura;
import ar.uba.fi.algo3.algoflight.model.interfaces.Aterrizador;
import ar.uba.fi.algo3.algoflight.model.juego.Escenario;
import ar.uba.fi.algo3.algoflight.model.juego.NivelDeDificultad;
import ar.uba.fi.algo3.algoflight.model.trayectorias.Trayectoria;
import ar.uba.fi.algo3.algoflight.model.trayectorias.TrayectoriaRecta;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public abstract class Avion implements Aterrizador, ObjetoVivo,
		ObjetoPosicionable {
	private Trayectoria trayectoria;
	private float velocidad;
	protected Figura forma;

	public Avion(Posicion posicionInicial, Escenario escenario) {
		List<Posicion> listaDePosiciones = new ArrayList<Posicion>();
		listaDePosiciones.add(posicionInicial);
		this.trayectoria = new TrayectoriaRecta(listaDePosiciones);
		this.velocidad = 1;
	}

	public void mover() {
		Posicion sigPosicion = trayectoria.obtenerSiguientePosicion(velocidad);
		List<Posicion> listaPosicionNueva = new ArrayList<Posicion>();
		listaPosicionNueva.add(trayectoria.obtenerPosicionActual());

		if (sigPosicion == null) {
			cambiarTrayectoria(new TrayectoriaRecta(listaPosicionNueva,
					trayectoria.getDireccion()));
		} else {
			while (!Escenario.estaDentroLimitesDelEscenario(sigPosicion, forma)) {
				cambiarTrayectoria(new TrayectoriaRecta(listaPosicionNueva));
				sigPosicion = trayectoria.obtenerSiguientePosicion(velocidad);
			}
		}
		trayectoria.avanzar(velocidad);
	}

	public void cambiarTrayectoria(Trayectoria nuevaTrayectoria) {
		this.trayectoria = nuevaTrayectoria;
	}

	public boolean hayColision(Avion otroAvion) {
		return forma.hayInterseccion(this.getPosicion(), otroAvion.getForma(),
				otroAvion.getPosicion());
	}

	public Posicion getPosicion() {
		return trayectoria.obtenerPosicionActual();
	}

	public Direccion getDireccion() {
		return trayectoria.getDireccion();
	}

	public Posicion getTamanioPerimetro() {
		return forma.getTamanioPerimetro();
	}

	public Figura getForma() {
		return forma;
	}

	public void setVelocidad(float velocidad) {
		this.velocidad = velocidad;
	}

	public float getVelocidad() {
		return this.velocidad;
	}

	public void vivir() {
		this.mover();
	}

	@Override
	public int getX() {
		return Math.round(this.getPosicion().getCoordX());
	}

	@Override
	public int getY() {
		return Math.round(this.getPosicion().getCoordY());
	}

	public void setVelocidadParaDificultad(NivelDeDificultad nivelDeDificultad) {
		this.velocidad = this.velocidad
				* nivelDeDificultad.getMultiplicadorVelocidad();
	}
}
